<?php

/**
 * Роутер
 * Парсит адрес запроса и либо выдает клиенту статический файл либо запускает 
 * запрошенный метод пользовательского модуля
 * @author Alexander NeonXP Kiryukhin
 * @copyright 2011 Alexander NeonXP Kiryukhin
 * @license GPLv2
 */
class router {

    static function route(&$obHTTP) {
        $sPath = $obHTTP->requestPath();
        $bUseVirualhost = (strtolower(config::getInstance()->get("usevirtualhost")) == 'yes');

        if ($bUseVirualhost) {
            list($sHost,$iPort) = explode(':',$obHTTP->headers('Host'))+array('127.0.0.1','4000');
            $arAliases = config::getInstance()->get("aliases");

            if (array_key_exists($sHost, $arAliases)) {
                $sHost = $arAliases[$sHost];
            }

            $arHosts = config::getInstance()->get("hosts");
            if (array_key_exists($sHost, $arHosts)) {
                $arHost = $arHosts[$sHost];
                $sPrefix = $arHost['prefix'];
                $sHost = "/$sHost";
            } else {
                $sHost = "";
                $sPrefix = "";
            }
        } else {
            $sHost = "";
            $sPrefix = "";
        }
        $sPath = str_replace('..', '', $sPath);
        if ($sPath == '/') {
            $sPath = "/index!main";
        }
        $sStaticFilesPattern = "/^\/.+\.(gif|jpg|jpeg|png|ico|css|js|txt|htm|html|xml|zip|rar|gz|7z)$/i";
        $sModulePattern = "/^\/[a-z0-9\_]+(\![a-z0-9\_]+){0,1}/i";
        if (preg_match($sStaticFilesPattern, $sPath)) {
            $sPath = "./static$sHost/$sPath";
            if (file_exists($sPath)) {
                $rsFileInfo = finfo_open(FILEINFO_MIME_TYPE);
                $sMimeType = finfo_file($rsFileInfo, $sPath);
                finfo_close($rsFileInfo);
                $obHTTP->
                        addHeader('Content-Type', $sMimeType, TRUE)->
                        startHTTP(file_get_contents($sPath))->
                        closeHTTP();
                unset($sHost);
                unset($sPrefix);
                unset($sPath);
                unset($arAliases);
                unset($arHost);
                unset($arHosts);
                unset($rsFileInfo);
                unset($sMimeType);
                unset($sPath);
                unset($sStaticFilesPattern);
                unset($sModulePattern);
                return;
            }
        } elseif (preg_match($sModulePattern, $sPath)) {
            $sPath = substr($sPath, 1);
            $arPath = explode('!', $sPath);
            $arPath[0] = $sPrefix . $arPath[0];
            if (!isset($arPath[1])) {
                $sMethod = 'main';
            } else {
                $sMethod = $arPath[1];
            }
            $sObject = 'ob' . strtoupper(substr($arPath[0], 0, 1)) . substr($arPath[0], 1);
            global $$sObject;
            if (is_object($$sObject)) {
                if (is_callable(array($$sObject, $sMethod))) {
                    $$sObject->$sMethod($obHTTP);
                    unset($sHost);
                    unset($sPrefix);
                    unset($sPath);
                    unset($arAliases);
                    unset($arHost);
                    unset($arHosts);
                    unset($rsFileInfo);
                    unset($sMimeType);
                    unset($sMethod);
                    unset($arPath);
                    unset($sPath);
                    unset($sStaticFilesPattern);
                    unset($sModulePattern);
                    return;
                }
            }
            unset($sMethod);
            unset($arPath);
        }
        $obHTTP->setResponseStatus('404 Not Found')->startHTTP('404 error')->closeHTTP();
        unset($sHost);
        unset($sPrefix);
        unset($sPath);
        unset($arAliases);
        unset($arHost);
        unset($arHosts);
        unset($rsFileInfo);
        unset($sMimeType);
        unset($sPath);
        unset($sStaticFilesPattern);
        unset($sModulePattern);
    }

}

